package features;



public abstract class Features {

	//private double[][] valores;
	private int x;
	private int y;
	private int dx;
	private int dy;
	private double limiar;
	
	
	public double getLimiar() {
		return limiar;
	}

	public void setLimiar(double limiar) {
		this.limiar = limiar;
	}

	public Features (int _x, int _y, int _dx, int _dy){
		
		this.x = _x;
		this.x = _y;
		this.x = _dx;
		this.x = _dy;
		
	}
	
	
	public void calculaLimiar(int  nPositivas,int  nNegativas, double sumNegativas, double sumPositivas){
		
		this.limiar = (sumPositivas/nPositivas + sumNegativas/nNegativas)/2;	
	}
	
	public int calculaH(double valor, int polaridade){
		
		if(polaridade*valor < polaridade*limiar)
			return 1;
		else return 0;
		
	}
	
	private  double integralImage(double[][] imagem, int _x, int _y) {

		if (_x == -1) {
			return 0;
		}else{
			return integralImage(imagem,_x-1, _y) + cumulativeRowSum(imagem,_x, _y);
		}

	}
	private  double cumulativeRowSum(double imagem[][],int _x, int _y) {

		if (_y == -1) {
			return 0;
		} else {
			double value = imagem[_y][_x];	
			return value + cumulativeRowSum(imagem,_x, _y - 1);
		}
	}
	
	public  double rectangleFeature(double[][] imagem,int _x , int _y,int _dx , int _dy){
		
		double A = integralImage(imagem,_x-1, _y-1);
		double B = integralImage(imagem,_x-1 + _dx, _y-1);
		double C = integralImage(imagem,_x-1, _y -1 + _dy);
		double D = integralImage(imagem,_x-1+_dx, _y-1 + _dy);
		
		
		return A + D - B - C;
	}
	
	
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public int getDx() {
		return dx;
	}
	public void setDx(int dx) {
		this.dx = dx;
	}
	public int getDy() {
		return dy;
	}
	public void setDy(int dy) {
		this.dy = dy;
	}

	public abstract double featureValue (double[][] imagem) ;
	
	
}
